#ifndef PRODUCTMODEL_H
#define PRODUCTMODEL_H

#include <QAbstractTableModel>
#include <QVector>
#include <QMap>
#include <QVariant>
#include "productdao.h"

// 商品数据模型，继承自QAbstractTableModel
// 负责为视图提供商品数据，并处理数据变更通知
class ProductModel : public QAbstractTableModel
{
    Q_OBJECT

public:
    // 构造函数：需要传入ProductDAO实例用于数据交互
    explicit ProductModel(ProductDAO *dao, QObject *parent = nullptr);

    // 重写QAbstractTableModel纯虚函数
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;

    // 自定义接口：加载所有商品数据
    bool loadAllProducts();

    // 自定义接口：通过ID获取商品数据
    QMap<QString, QVariant> getProductById(int productId);

    // 自定义接口：添加商品（会同步更新数据库和模型）
    bool addProduct(const QMap<QString, QVariant> &productData);

    // 自定义接口：更新商品（会同步更新数据库和模型）
    bool updateProduct(int productId, const QMap<QString, QVariant> &productData);

    // 自定义接口：删除商品（会同步更新数据库和模型）
    bool deleteProduct(int row);

    // 自定义接口：通过名称搜索商品
    bool searchProducts(const QString &name);

    bool filterByCategory(int categoryId); // 新增方法

    // 添加以下两个方法声明
   Qt::ItemFlags flags(const QModelIndex &index) const override;
   bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;

   QVector<QMap<QString, QVariant>> getAllCategories(); // 新增方法

   // 新增方法：获取所有商品数据
   QVector<QMap<QString, QVariant>> getAllProducts() const;

   // 新增方法：获取分类统计信息
   QMap<int, int> getCategoryStatistics();



signals:
   void dataError(const QString &errorMessage);

private:
    ProductDAO *m_dao; // 数据访问对象，用于数据库操作
    QVector<QMap<QString, QVariant>> m_products; // 缓存的商品数据
    QStringList m_columns; // 列名列表，与数据库字段对应
};

#endif // PRODUCTMODEL_H
